//package com.easy.frame.common.mq.rabbit.producer;
//
//import com.easy.frame.base.basic.exception.ServiceException;
//import com.easy.frame.base.service.mq.BrokerMessageLogExample;
//import com.easy.frame.base.service.mq.MessageHelper;
//import com.easy.frame.base.service.mq.RabbitUtil;
//import com.easy.frame.base.service.mq.constant.RabbitConstants;
//import com.easy.frame.common.redis.RedisUtil;
//import com.easy.frame.servers.sys.entity.BrokerMessageLog;
//import com.easy.frame.servers.sys.entity.TOrder;
//import com.easy.frame.servers.sys.mapper.BrokerMessageLogMapper;
//import com.easy.frame.servers.sys.mq.confirm.ConfirmCallBack;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.amqp.core.Message;
//import org.springframework.amqp.core.MessageProperties;
//import org.springframework.amqp.rabbit.connection.CorrelationData;
//import org.springframework.amqp.rabbit.core.RabbitTemplate;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//import org.springframework.util.StringUtils;
//
//import javax.annotation.Resource;
//import java.util.Date;
//import java.util.Map;
//import java.util.UUID;
//
///**
// * Rabbit发送工具类
// *
// * @author 86131
// */
//@Component
//@Slf4j
//public class RabbitSendUtil {
//
//    @Resource
//    private BrokerMessageLogMapper brokerMessageLogMapper;
//
//    @Autowired
//    RabbitTemplate rabbitTemplate;
//
//    //回调函数: confirm确认
//    final RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
//        @Override
//        public void confirm(CorrelationData correlationData, boolean ack, String cause) {
//            System.err.println("correlationData: " + correlationData);
//            if (StringUtils.isEmpty(correlationData)) {
//                throw new ServiceException("rabbitmq异常，correlationData为空");
//            }
//            String messageId = correlationData.getId();
//
//            BrokerMessageLogExample brokerMessageLogExample = new BrokerMessageLogExample();
//            brokerMessageLogExample.createCriteria().andMessage_idEqualTo(messageId);
//
//            BrokerMessageLog brokerMessageLog = null;
//            try {
//                brokerMessageLog =
//                        brokerMessageLogMapper.selectByExample(brokerMessageLogExample).get(0);
//
//            } catch (IndexOutOfBoundsException e) {
//                log.error("不存在messageId:{}的日志记录", messageId);
//            }
//            if (ack) {
//                brokerMessageLog.setStatus(RabbitConstants.ORDER_SEND_SUCCESS);
//                brokerMessageLog.setUpdateTime(new Date());
//                //如果confirm返回成功 则进行更新
//                brokerMessageLogMapper.changeBrokerMessageLogStatus(messageId, RabbitConstants.ORDER_SEND_SUCCESS, new Date());
//                RedisUtil.getInstance().del(correlationData.toString());
//            } else {
//                //失败则进行具体的后续操作:重试 或者补偿等手段
//                System.err.println("异常处理...");
//            }
//        }
//    };
//
//
//    /**
//     * 测试 Direct 模式.
//     * 简单测试，一对一的发送方式
//     *
//     * @param p 表示传递的参数数据
//     */
//    public void sendMsg(String p) {
//        Message message = MessageHelper.objToMsg(p);
//        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
//        confirm(message, correlationData);
//        RabbitUtil.RabbitServer.I.getInstance().convertAndSend
//                (RabbitConstants.Exchange.EF_HANDLER_EXCHANGE, RabbitConstants.Key.EF_HANDLER, message, correlationData);
//    }
//
//
//    /**
//     * 测试发送我们的消息
//     *
//     * @param msg     消息内容
//     * @param msgProp 消息属性
//     */
//    public void sendMsg(Object msg, Map<String, Object> msgProp) {
//        //构建消息对象
//        Message message = MessageHelper.objToMsg(msg);
//        //构建correlationData 用于做可靠性投递得,ID:必须为全局唯一的 根据业务规则
//        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
//        confirm(message, correlationData);
//        RabbitUtil.RabbitServer.I.getInstance().convertAndSend
//                (RabbitConstants.Exchange.EF_HANDLER_EXCHANGE, RabbitConstants.Key.EF_HANDLER, message, correlationData);
//    }
//
//    public static void sendOrderMsg(TOrder entity) throws Exception {
//        //构建correlationData 用于做可靠性投递得,ID:必须为全局唯一的 根据业务规则
//        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
//        //开启确认模式
//        RabbitUtil.RabbitServer.I.getInstance().setConfirmCallback(new ConfirmCallBack());
//        /*发送core下的message对象*/
//        ObjectMapper objectMapper = new ObjectMapper();
//        String orderJson = objectMapper.writeValueAsString(entity);
//        MessageProperties messageProperties = new MessageProperties();
//        Message message = new Message(orderJson.getBytes(), messageProperties);
//        RabbitUtil.RabbitServer.I.getInstance().convertAndSend
//                (RabbitConstants.Exchange.EF_HANDLER_EXCHANGE, RabbitConstants.Key.EF_HANDLER, message, correlationData);
//
//    }
//
//    /**
//     * 1.redis分布式锁
//     * 2.开启确认模式
//     */
//    public void confirm(Message message, CorrelationData correlationData) {
//        String correlationDataId = correlationData.getId();
//        message.getMessageProperties().setCorrelationId(correlationDataId);
//        //设置锁，超时时间3分钟
//        RedisUtil.getInstance().setIfAbsent(correlationDataId, message.toString());
//        //开启确认模式
//        RabbitUtil.RabbitServer.I.getInstance().setMandatory(true);
//        RabbitUtil.RabbitServer.I.getInstance().setConfirmCallback(confirmCallback);
//    }
//}
